1000 REM----------------------- 1010 REM- - 1020 REM- DISK DOCTOR - 1030 REM- - 1040 REM- BY JOHN TANZINI - 1050 REM- - 1060 REM----------------------- 1070 PRINT "[147]SELECT A NUMBER.": PRINT 1080 PRINT "1. LIST DIRECTORY": PRINT 1090 PRINT "2. RESTORE A FILE": PRINT 1100 PRINT "3. PACK DIRECTORY": PRINT 1110 PRINT "4. LIST USED BLOCKS": PRINT 1120 PRINT "5. VIEW OR MODIFY": PRINT "BLOCK": PRINT 1130 PRINT "6. FORMAT DISK": PRINT 1140 PRINT "7. SEND DISK COMMAND": PRINT 1150 PRINT: PRINT: PRINT "PRESS E TO END." 1160 GET KK$: IF KK$="" THEN 1160 1170 IF KK$="E" THEN PRINT "[147]";: END 1180 KK = VAL(KK$) 1190 ON KK GOSUB 1380, 1720, 2610, 3350, 3810, 4770, 4950 1200 GOTO 1070 1210 REM----------------------------- 1220 REM- - 1230 REM- DISK ERROR SUBROUTINE - 1240 REM- - 1250 REM----------------------------- 1260 PRINT: PRINT: PRINT "**** DISK ERROR ****" 1270 PRINT: PRINT E1$;" ";E2$;" ";E3$;" ";E4$ 1280 PRINT: PRINT "PRESS ANY KEY TO" 1290 PRINT "RETURN TO MENU" 1300 GET K$: IF K$="" THEN 1300 1310 RETURN 1320 REM----------------------------- 1330 REM- - 1340 REM- PART 1 - 1350 REM- LIST ENTIRE DIRECTORY - 1360 REM- - 1370 REM----------------------------- 1380 OPEN 15,8,15 1390 OPEN 2,8,2,"#2" 1400 T = 18: S = 1: PRINT "[147]" 1410 PRINT#15,"U1:";2;8;T;S 1420 INPUT#15, E1$, E2$, E3$, E4$ 1430 IF E1$<>"00" THEN GOSUB 1260: GOTO 1640 1440 PRINT#15,"B-P:";2;0 1450 GET#2,T$: GET#2, S$ 1460 FOR I = 2 TO 226 STEP 32 1470 PRINT#15,"B-P:";2;I 1480 GET#2, A$: IF A$="" THEN PRINT ""; 1490 GET#2, A$: GET#2, A$ 1500 PRINT ""; 1510 FOR J = 1 TO 16 1520 GET#2, A$: PRINT A$; 1530 NEXT 1540 IF A$<>"" THEN PRINT: PRINT 1550 GET K$: IF K$="" THEN 1590 1560 IF K$="E" THEN 1640 1570 GET K$: IF K$="" THEN GOTO 1570 1580 IF K$="E" THEN 1640 1590 NEXT 1600 T = ASC(T$+CHR$(0)): S = ASC(S$+CHR$(0)) 1610 IF T>0 AND T<36 THEN GOTO 1410 1620 PRINT: PRINT "PRESS ANY KEY TO": PRINT "RETURN TO MENU" 1630 GET K$: IF K$="" THEN 1630 1640 CLOSE 2: CLOSE 15 1650 RETURN 1660 REM---------------------------- 1670 REM- - 1680 REM- PART 2 1690 REM- RESTORE SCRATCHED FILE - 1700 REM- - 1710 REM---------------------------- 1720 PRINT "[147]ENTER NAME OF FILE" 1730 INPUT N1$ 1740 PRINT: PRINT: PRINT "IS THE FILE A" 1750 PRINT: PRINT "1. PROGRAM" 1760 PRINT: PRINT "2. SEQUENTIAL FILE" 1770 GET K$: IF K$="1" THEN FT = 130: GOTO 1800 1780 IF K$="2" THEN FT = 129: GOTO 1800 1790 GOTO 1770 1800 PRINT: PRINT: PRINT "RESTORING"; N1$ 1810 OPEN 15,8,15 1820 OPEN 2,8,2,"#0" 1830 OPEN 3,8,3,"#1" 1840 GOSUB 2350: REM FIND FILE IN DIRECTORY 1850 IF PT=0 THEN 2040; REM CANNOT RESTORE 1860 PRINT#15,"B-A:";0;PT;PS 1870 INPUT#15,E1$,E2$,E3$,E4$ 1880 IF E1$<>"00" AND E1$<>"65" THEN GOSUB 1260: RETURN 1890 IF E1$="65" THEN 2040: REM CANNOT RESTORE 1900 PRINT#15,"U1:";3;0;PT;PS 1910 LT = PT: LS = PS 1920 PRINT#15,"B-P:";3;0 1930 GET#3,PT$: GET#3,PS$ 1940 PT = ASC(PT$+CHR$(0)): PS = ASC(PS$+CHR$(0)) 1950 IF PT=0 THEN GOTO 2100: REM SUCCESSFUL RESTORE 1960 PRINT#15,"B-A:";0;PT;PS 1970 INPUT#15,E1$,E2$,E3$,E4$ 1980 IF E1$<>"65" AND E1$<>"00" THEN GOSUB 1260: RETURN 1990 IF E1$="65" THEN 2180: REM PARTIAL RESTORE 2000 GOTO 1900: REM READ ANOTHER BLOCK 2010 REM 2020 REM ----- CANNOT RESTORE ----- 2030 REM 2040 PRINT: PRINT: PRINT "*** CANNOT ***" 2050 PRINT "*** RESTORE ***" 2060 GOTO 2280 2070 REM 2080 REM ----- SUCCESSFUL RESTORE ----- 2090 REM 2100 PRINT#15,"B-P:";2;DP 2110 PRINT#2,CHR$(FT); 2120 PRINT#15,"U2:";2;0;T;S 2130 PRINT: PRINT: PRINT "*** SUCCESSFUL ***": PRINT "*** RESTORE ***" 2140 GOTO 2280 2150 REM 2160 REM ----- PARTIAL RESTORE ----- 2170 REM 2180 PRINT#15,"B-P:";2;DP 2190 PRINT#2,CHR$(FT); 2200 PRINT#15,"U2:";2;0;T;S 2210 PRINT#15,"B-P:";3;0 2220 PRINT#3,CHR$(0); 2230 PRINT#15,"B-P:";3;248 2240 FOR Z = 1 TO 8: PRINT#3,CHR$(0);: NEXT 2250 PRINT#15,"U2:";3;0;LT;LS 2260 PRINT: PRINT: PRINT "*** PARTIAL ***" 2270 PRINT "*** RESTORE ***" 2280 PRINT: PRINT "PRESS ANY KEY TO": PRINT "RETURN TO MENU" 2290 GET K$: IF K$="" THEN GOTO 2290 2300 CLOSE 2: CLOSE 3: CLOSE 15 2310 RETURN 2320 REM 2330 REM ---- FIND TRACK AND SECTOR OF FILE ---- 2340 REM 2350 T = 18: S = 1 2360 PRINT#15,"U1:";2;8;T;S 2370 INPUT#15, E1$, E2$, E3$, E4$ 2380 IF E1$<>"00" THEN GOSUB 1260: PT = 0: GOTO 2540 2390 PRINT#15,"B-P:";2;0 2400 GET#2,T$: GET#2, S$ 2410 FOR I = 2 TO 226 STEP 32 2420 PRINT#15,"B-P:";2;I 2430 GET#2, A$: IF A$<>"" THEN 2500 2440 GET#2, PT$: GET#2, PS$ 2450 N2$ = "" 2460 FOR J = 1 TO 16 2470 GET#2, A$: IF A$<>CHR$(160) THEN N2$=N2$+A$ 2480 NEXT 2490 IF N1$=N2$ THEN PT = ASC(PT$+CHR$(0)): PS = ASC(PS$+CHR$(0)): DP = I: RETURN 2500 NEXT 2510 T = ASC(T$+CHR$(0)): S = ASC(S$+CHR$(0)) 2520 IF T>0 AND T<36 THEN GOTO 2360 2530 PT = 0 2540 RETURN 2550 REM---------------------- 2560 REM- - 2570 REM- PART 3 - 2580 REM- PACK DIRECTORY - 2590 REM- - 2600 REM---------------------- 2610 PRINT "[147]IS CORRECT DISK IN": PRINT "DRIVE? (Y/N) 2620 [161] K$: [139] K$[178]"" [167] 2620 2630 [139] K$[179][177]"Y" [167] [142] 2640 [153]: [153]: [153] 2650 [153] "*************" 2660 [153] "* PACKING * 2670 PRINT "*************" 2680 OPEN 15,8,15 2690 OPEN 2,8,2,"#0" 2700 OPEN 3,8,3,"#1" 2710 RT = 18: RS = 1 2720 WT = 18: WS = 1 2730 LT = 0 2740 DF = 0 2750 EF = 0 2760 GOSUB 3060: REM NEXT-WRITE-BLOCK 2770 IF EF=1 THEN 3010 2780 GOSUB 3220: REM NEXT-READ-BLOCK 2790 IF EF=1 THEN 3010 2800 FOR RI = 2 TO 226 STEP 32 2810 PRINT#15, "B-P:";3;RI 2820 GET#3, FT$ 2830 IF FT$="" THEN 2920 2840 IF WI>255 THEN GOSUB 3060: REM NEXT-WRITE-BLOCK 2850 IF EF=1 THEN 3010 2860 PRINT#15, "B-P:";2;WI 2870 PRINT#2, FT$; 2880 FOR I = 1 TO 29 2890 GET#3, A$: PRINT#2, LEFT$(A$+CHR$(0),1); 2900 NEXT I 2910 WI = WI + 32 2920 NEXT RI 2930 IF RT<>0 THEN 2780 2940 IF WI<255 THEN GOTO 2970 2950 GOSUB 3060: REM NEXT-WRITE-BLOCK 2960 IF DF = 1 THEN 3010 2970 PRINT#15, "B-P:";2;WI 2980 PRINT#2,CHR$(0); 2990 WI = WI + 32 3000 GOTO 2940 3010 CLOSE 2: CLOSE 3: CLOSE 15 3020 RETURN 3030 REM 3040 REM ---- NEXT-WRITE-BLOCK ---- 3050 REM 3060 IF LT<>0 THEN PRINT#15, "U2:";2;0;LT;LS 3070 INPUT#15, E1$, E2$, E3$, E4$ 3080 IF E1$<>"00" THEN EF=1: GOSUB 1260: RETURN 3090 LT = WT: LS = WS 3100 IF WT=0 THEN DF = 1: RETURN 3110 PRINT#15, "U1:";2;0;WT;WS 3120 INPUT#15, E1$, E2$, E3$, E4$ 3130 IF E1$<>"00" THEN EF=1: GOSUB 1260: RETURN 3140 PRINT#15, "B-P:";2;0 3150 GET#2, WT$: GET#2, WS$ 3160 WT = ASC(WT$+CHR$(0)): WS = ASC(WS$+CHR$(0)) 3170 WI = 2 3180 RETURN 3190 REM 3200 REM ---- NEXT-READ-BLOCK ---- 3210 REM 3220 PRINT#15,"U1:";3;0;RT;RS 3230 INPUT#15, E1$, E2$, E3$, E4$ 3240 IF E1$<>"00" THEN EF=1: GOSUB 1260: RETURN 3250 PRINT#15, "B=P:";3;0 3260 GET#3, RT$: GET#3, RS$ 3270 RT = ASC(RT$+CHR$(0)): RS = ASC(RS$+CHR$(0)) 3280 RETURN 3290 REM--------------------------- 3300 REM- - 3310 REM- PART 4 - 3320 REM- LIST ALLOCATED BLOCKS - 3330 REM- - 3340 REM--------------------------- 3350 IF LF=0 THEN DIM BM%(35,4): LF = 1 3360 PRINT "[147]"; TAB(4); "TRACK"; TAB(10); "SECTOR": PRINT 3370 OPEN 15,8,15 3380 OPEN 2,8,2,"#0" 3390 PRINT#15, "U1:";2;0;18;0 3400 INPUT#15, E1$, E2$, E3$, E4$ 3410 IF E1$<>"00" THEN GOSUB 1260: GOTO 3720 3420 PRINT#15, "B-P:";2;4 3430 FOR T = 1 TO 35 3440 FOR J = 0 TO 3 3450 GET#2, A$ 3460 BM%(T,J) = ASC(A$+CHR$(0)) 3470 NEXT J, T 3480 RESTORE 3490 NB = 0 3500 FOR N = 1 TO 4 3510 READ T1, T2, NS 3520 FOR T = T1 TO T2 3530 IF T<>18 THEN NB = NB + BM%(T,0) 3540 IF BM%(T,0)=NS THEN 3680 3550 S = 0 3560 FOR I = 1 TO 3 3570 B2 = BM%(T,I) 3580 FOR J = 1 TO 8 3590 B1 = B2/2: B2 = INT(B1) 3600 IF B1=B2 THEN PRINT TAB(4); T; TAB(11); S 3610 GET K$: IF K$="" THEN 3650 3620 IF K$="E" THEN 3720 3630 GET K$: IF K$="" THEN 3630 3640 IF K$="E" THEN 3720 3650 S = S + 1 3660 IF S=NS THEN 3680 3670 NEXT J, I 3680 NEXT T, N 3690 PRINT: PRINT NB; "BLOCKS FREE.": PRINT 3700 PRINT: PRINT "PRESS ANY KEY TO": PRINT "RETURN TO MENU" 3710 GET K$: IF K$="" THEN 3710 3720 CLOSE 2: CLOSE 15 3730 RETURN 3740 DATA 1,17,21,18,24,19,25,30,18,31,35,17 3750 REM-------------------------- 3760 REM- - 3770 REM- PART 5 - 3780 REM- VIEW OR MODIFY BLOCK - 3790 REM- - 3800 REM-------------------------- 3810 IF VF=0 THEN DIM B%(255): VF = 1 3820 OPEN 15,8,15 3830 OPEN 2,8,2,"#0" 3840 PRINT "[147] ALL NUMBERS DECIMAL" 3850 PRINT "----------------------": PRINT: PRINT 3860 PRINT " 1. READ BLOCK": PRINT 3870 PRINT " 2. VIEW BLOCK": PRINT 3880 PRINT " 3. MODIFY BLOCK": PRINT 3890 PRINT " 4. WRITE BLOCK BACK" 3900 PRINT: PRINT: PRINT: PRINT "PRESS E TO EXIT" 3910 GET C$: IF C$="" THEN 3910 3920 IF C$="E" THEN CLOSE 2: CLOSE 15: RETURN 3930 C = VAL(C$) 3940 ON C GOSUB 3990, 4130, 4400, 4530 3950 GOTO 3840 3960 REM 3970 REM---- BLOCK READ ---- 3980 REM 3990 PRINT "[147]ENTER TRACK, SECTOR" 4000 INPUT TT, SS 4010 PRINT#15, "U1:";2;0;TT;SS 4020 INPUT#15, E1$, E2$, E3$, E4$ 4030 IF E1$<>"00" THEN GOSUB 1260: RETURN 4040 PRINT#15,"B-P:";2;0 4050 FOR I = 0 TO 255 4060 GET#2, A$ 4070 B%(I) = ASC(A$ + CHR$(0)) 4080 NEXT 4090 RETURN 4100 REM 4110 REM---- VIEW BLOCK ---- 4120 REM 4130 FOR I = 0 TO 3 4140 PRINT "[147]TRACK ="; TT; "SECT ="; SS: PRINT 4150 FOR J = 0 TO 15 4160 N = 4*J + 64*I 4170 S2$ = "" 4180 S1$ = RIGHT$(" "+STR$(N),3) + CHR$(125) 4190 FOR K = 0 TO 1 4200 M = N + 2*K 4210 S1$ = S1$ + RIGHT$(" "+STR$(B%(M)),3) + "" + RIGHT$(" "+STR$(B%(M+1)),3) + "[146]" 4220 A$ = CHR$(32) 4230 IF B%(M)>31 THEN IF B%(M)<123 THEN A$ = CHR$(B%(M)) 4240 S2$ = S2$ + A$ 4250 A$ = CHR$(32) 4260 IF B%(M+1)>31 THEN IF B%(M+1)<123 THEN A$ = CHR$(B%(M+1)) 4270 S2$ = S2$ + A$ 4280 NEXT K 4290 PRINT S1$; CHR$(125); S2$ 4300 NEXT J 4310 PRINT: PRINT: PRINT "PRESS ANY KEY TO CONT" 4320 PRINT TAB(12); "E TO END" 4330 GET K$: IF K$="" THEN 4330 4340 IF K$="E" THEN RETURN 4350 NEXT I 4360 RETURN 4370 REM 4380 REM---- CHANGE BLK ---- 4390 REM 4400 PRINT "[147]PRESS RETURN[146] TO" 4410 PRINT "RETURN TO MENU.": PRINT: PRINT: PRINT 4420 PRINT "ENTER LOCATION, DATA" 4430 L = -1: D = -1 4440 INPUT "(0-255)"; L, D 4450 IF (L<0)OR(D<0) THEN RETURN 4460 IF L>255 OR D>255 THEN PRINT "* NUMBER TOO LARGE *": PRINT: GOTO 4420 4470 B%(L) = D 4480 PRINT 4490 GOTO 4420 4500 REM 4510 REM---- BLOCK WRITE ---- 4520 REM 4530 PRINT "[147]"; TAB(1); TT; "[157],"; SS 4540 PRINT "[145][145]ENTER TRACK, SECTOR" 4550 INPUT TT, SS 4560 PRINT "ARE YOU SURE? (Y/N) 4570 [161] A$: [139] A$[178]"" [167] [137] 4570 4580 [139] A$[179][177]"Y" [167] [142] 4590 [153] 4600 [153] "*******************" 4610 [153] "* WRITING BLOCK *" 4620 [153] "*******************" 4630 [152]15,"B-P:";2;0 4640 [129] L [178] 0 [164] 255 4650 [152]2, [199](B%(L)); 4660 [130] L 4670 [152]15, "U2:";2;0;TT;SS 4680 [132]15, E1$, E2$, E3$, E4$ 4690 [139] E1$[179][177]"00" [167] [141] 1260: [142] 4700 [142] 4710 [143]----------------------- 4720 [143]- - 4730 [143]- PART 6 - 4740 [143]- FORMAT A DISK - 4750 [143]- - 4760 [143]----------------------- 4770 [153] "LOADENTER NAME OF DISK" 4780 [133] NA$ 4790 [153] "DISK I.D." 4800 [133] ID$ 4810 [153] "IS CORRECT DISK IN": [153] "DRIVE? (Y/N)" 4820 [161] K$: [139] K$[178]"" [167] 4820 4830 [139] K$[179][177]"Y" [167] [142] 4840 [159] 15,8,15,"N:"[170]NA$[170]","[170]ID$ 4850 [132]15, E1$, E2$, E3$, E4$ 4860 [139] E1$[179][177]"00" [167] [141] 1260 4870 [160] 15 4880 [142] 4890 [143]----------------------- 4900 [143]- - 4910 [143]- PART 7 - 4920 [143]- SEND DISK COMMAND - 4930 [143]- - 4940 [143]----------------------- 4950 [153] "LOADENTER DISK COMMAND": [153]: [153] "?"; 4960 C$ [178] "" 4970 [158] 65487 4980 C [178] [194](780) 4990 [139] C[179][177]13 [167] C$ [178] C$ [170] [199](C): [137] 4970 5000 [159] 15,8,15: [159] 2,8,2,"#" 5010 [152]15, C$ 5020 [132]15, E1$, E2$, E3$, E4$ 5030 [139] E1$[179][177]"00" [175] E1$[179][177]"01" [167] [141] 1260 5040 [160] 2: [160] 15 5050 [142]